home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MacWorld: Conference & Expo 2005
/
Macworld Conference and Expo - Documentation CD-ROM (2004).iso
/
mac
/
Adobe Reader 6.0
/
Adobe Reader 6.0.app
/
Contents
/
MacOS
/
xfdf2cos.xml
< prev
Wrap
Extensible Markup Language
|
2004-01-30
|
34KB
|
1,052 lines
<?xml version="1.0" encoding="UTF-8" ?>
<!-- postprocess -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="no" omit-xml-declaration="no"/>
<!-- All this does is traverse a string of numbers and emit them
as a sequence of elements with a single attribute -->
<xsl:template name="emitNumbers">
<xsl:param name="NumberString"/>
<xsl:variable name="DelimiterFound" select="contains($NumberString, ',')"/>
<xsl:variable name="NumberValue">
<xsl:choose>
<xsl:when test="$DelimiterFound">
<xsl:value-of select="number(substring-before($NumberString, ','))"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="number($NumberString)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="ElementName">
<xsl:choose>
<xsl:when test="floor($NumberValue) = $NumberValue">INT</xsl:when>
<xsl:otherwise>FIXED</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$ElementName}">
<xsl:attribute name="VAL">
<xsl:value-of select="$NumberValue"/>
</xsl:attribute>
</xsl:element>
<xsl:if test="$DelimiterFound">
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString"><xsl:value-of select="substring-after($NumberString, ',')"/></xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- All this does is traverse a string of filters and emit them
as a sequence of elements with a single attribute -->
<xsl:template name="emitFilters">
<xsl:param name="FilterList"/>
<xsl:variable name="DelimiterFound" select="contains($FilterList, ',')"/>
<xsl:variable name="FilterValue">
<xsl:choose>
<xsl:when test="$DelimiterFound">
<xsl:value-of select="substring-before($FilterList, ',')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$FilterList"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="NAME">
<xsl:attribute name="VAL">
<xsl:value-of select="$FilterValue"/>
</xsl:attribute>
</xsl:element>
<xsl:if test="$DelimiterFound">
<xsl:call-template name="emitFilters">
<xsl:with-param name="FilterList">
<xsl:value-of select="substring-after($FilterList, ',')"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- convert a hex digit into a decimal value -->
<xsl:template name="convertHexDigit">
<xsl:param name="HexChar"/>
<xsl:choose>
<xsl:when test="$HexChar='A'">10</xsl:when>
<xsl:when test="$HexChar='B'">11</xsl:when>
<xsl:when test="$HexChar='C'">12</xsl:when>
<xsl:when test="$HexChar='D'">13</xsl:when>
<xsl:when test="$HexChar='E'">14</xsl:when>
<xsl:when test="$HexChar='F'">15</xsl:when>
<xsl:otherwise><xsl:value-of select="$HexChar"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- generate a sequence of FIXED/INT nodes for each RGB value -->
<xsl:template name="convertHexColorToFloat">
<xsl:param name="HexString"/>
<xsl:if test="$HexString != ''">
<xsl:variable name="firstdigit">
<xsl:call-template name="convertHexDigit">
<xsl:with-param name="HexChar"><xsl:value-of select="substring($HexString, 1, 1)"/></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="seconddigit">
<xsl:call-template name="convertHexDigit">
<xsl:with-param name="HexChar"><xsl:value-of select="substring($HexString, 2, 1)"/></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="NumberValue">
<xsl:value-of select="(number($firstdigit) * 16 + number($seconddigit)) div 255"/>
</xsl:variable>
<xsl:variable name="ElementName">
<xsl:choose>
<xsl:when test="floor($NumberValue) = $NumberValue">INT</xsl:when>
<xsl:otherwise>FIXED</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$ElementName}">
<xsl:attribute name="VAL">
<xsl:choose>
<xsl:when test="$ElementName = 'FIXED'">
<!-- only put out color to six decimal places -->
<xsl:value-of select="format-number($NumberValue, '0.0#####')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$NumberValue"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:element>
<xsl:call-template name="convertHexColorToFloat">
<xsl:with-param name="HexString">
<xsl:value-of select="substring($HexString, 3)"/>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- map the flags to their corresponding integer values -->
<xsl:template name="mapFlags">
<xsl:param name="FlagValue"/>
<xsl:choose>
<xsl:when test="$FlagValue = 'invisible'">1</xsl:when>
<xsl:when test="$FlagValue = 'hidden'">2</xsl:when>
<xsl:when test="$FlagValue = 'print'">4</xsl:when>
<xsl:when test="$FlagValue = 'nozoom'">8</xsl:when>
<xsl:when test="$FlagValue = 'norotate'">16</xsl:when>
<xsl:when test="$FlagValue = 'noview'">32</xsl:when>
<xsl:when test="$FlagValue = 'readonly'">64</xsl:when>
<xsl:when test="$FlagValue = 'locked'">128</xsl:when>
<xsl:when test="$FlagValue = 'togglenoview'">256</xsl:when>
</xsl:choose>
</xsl:template>
<!-- convert the string values of the flags
attribute into a bitfield value -->
<xsl:template name="convertFlags">
<xsl:param name="FlagString"/>
<xsl:variable name="DelimiterFound" select="contains($FlagString, ',')"/>
<xsl:variable name="FlagValue">
<xsl:choose>
<xsl:when test="$DelimiterFound">
<xsl:value-of select="substring-before($FlagString, ',')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$FlagString"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="CurrentValue">
<xsl:call-template name="mapFlags">
<xsl:with-param name="FlagValue"><xsl:value-of select="$FlagValue"/></xsl:with-param>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$DelimiterFound">
<!-- recurse on the rest of the flags,
summing the result on return to get the
bitfield values -->
<xsl:variable name="RestValue">
<xsl:call-template name="convertFlags">
<xsl:with-param name="FlagString" select="substring-after($FlagString, ',')"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="number($CurrentValue) + $RestValue"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$CurrentValue"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- dump the data node into the stream! -->
<xsl:template name="emitData">
<xsl:param name="StreamData"/>
<xsl:for-each select="$StreamData">
<xsl:element name="DATA">
<xsl:attribute name="MODE">
<xsl:value-of select="translate (@mode, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
</xsl:attribute>
<xsl:attribute name="ENCODING">
<xsl:value-of select="translate (@encoding, 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:template name="emitStream">
<xsl:param name="StreamData"/>
<xsl:param name="FilterData"/>
<xsl:param name="AnnotationType"/>
<xsl:choose>
<xsl:when test="$AnnotationType = 'sound'">
<xsl:element name="NAME">
<xsl:attribute name="KEY">Type</xsl:attribute>
<xsl:attribute name="VAL">Sound</xsl:attribute>
</xsl:element>
<xsl:element name="STREAM">
<xsl:attribute name="KEY">Sound</xsl:attribute>
<!-- fill in the content of the
annotation define id later -->
<xsl:attribute name="DEFINE"/>
<xsl:apply-templates select="@length|../@encoding|../@rate|../@bits|../@channels|$FilterData"/>
<xsl:call-template name="emitData">
<xsl:with-param name="StreamData" select="$StreamData"/>
</xsl:call-template>
</xsl:element>
</xsl:when>
<xsl:when test="$AnnotationType = 'fileattachment'">
<xsl:choose>
<xsl:when test="name() = 'data'">
<xsl:element name="DICT">
<xsl:attribute name="KEY">FS</xsl:attribute>
<xsl:apply-templates select="../@file"/>
<xsl:element name="NAME">
<xsl:attribute name="KEY">Type</xsl:attribute>
<xsl:attribute name="VAL">Filespec</xsl:attribute>
</xsl:element>
<xsl:element name="DICT">
<xsl:attribute name="KEY">EF</xsl:attribute>
<xsl:element name="STREAM">
<xsl:attribute name="KEY">F</xsl:attribute>
<!-- fill in the content of the
annotation define id later -->
<xsl:attribute name="DEFINE"/>
<xsl:apply-templates select="@length|../@mimetype|$FilterData"/>
<xsl:for-each select="..">
<xsl:if test="@creation|@modification|@checksum|@size|*[name()='resource']">
<xsl:element name="DICT">
<xsl:attribute name="KEY">Params</xsl:attribute>
<!-- using resource here will cause recursion -->
<xsl:apply-templates select="@creation|@modification|@checksum|@size|*[name()='resource']"/>
</xsl:element>
</xsl:if>
</xsl:for-each>
<xsl:call-template name="emitData">
<xsl:with-param name="StreamData" select="$StreamData"/>
</xsl:call-template>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'resource'">
<xsl:element name="DICT">
<xsl:attribute name="KEY">Mac</xsl:attribute>
<xsl:apply-templates select="@subtype|@creator"/>
<xsl:element name="STREAM">
<xsl:attribute name="KEY">ResFork</xsl:attribute>
<!-- fill in the content of the
annotation define id later -->
<xsl:attribute name="DEFINE"/>
<xsl:apply-templates select="@length|$FilterData"/>
<xsl:call-template name="emitData">
<xsl:with-param name="StreamData" select="$StreamData"/>
</xsl:call-template>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template match="/">
<xsl:element name="PDF">
<xsl:element name="CATALOG">
<xsl:element name="DICT">
<xsl:attribute name="DEFINE">1/0</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:element>
<!-- just dropped this in -->
<INFO><NULL/></INFO>
</xsl:element>
</xsl:template>
<xsl:template match="*">
<xsl:choose>
<xsl:when test="name() = 'xfdf'">
<xsl:element name="DICT">
<xsl:attribute name="KEY">FDF</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'appearance'">
<xsl:element name="APPEARANCE">
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
<!-- beginning of field handling -->
<xsl:when test="name() = 'fields'">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">Fields</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'field'">
<xsl:element name="DICT">
<xsl:element name="STRING">
<xsl:attribute name="KEY">T</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="@name"/>
</xsl:element>
<xsl:choose>
<!-- for some reason, the commented out
test doesn't work. the following one
does - they should be equivalent -->
<!--<xsl:when test="field">-->
<xsl:when test="*[name() = 'field']">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">Kids</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:when>
<xsl:when test="count(*[name() = 'value']) > 1">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">V</xsl:attribute>
<xsl:apply-templates/>
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'value'">
<xsl:element name="STRING">
<xsl:attribute name="KEY">V</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'value-richtext'">
<xsl:element name="STRING">
<xsl:attribute name="KEY">RV</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:when>
<!-- end of field handling -->
<!-- beginning of annotation handling -->
<xsl:when test="name() = 'annots'">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">Annots</xsl:attribute>
<xsl:for-each select="*">
<xsl:apply-templates select="."/>
<xsl:for-each select="*[name() = 'popup']">
<!-- fill in the content of the
popup reference later -->
<xsl:element name="DICT">
<xsl:attribute name="REF"/>
</xsl:element>
</xsl:for-each>
</xsl:for-each>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'f'">
<xsl:element name="STRING">
<xsl:attribute name="KEY">F</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="@href"/>
</xsl:element>
<xsl:if test="not(../*[name()='ids'])">
<!-- just dropped this in -->
<ARRAY KEY="ID"><STRING/><STRING/></ARRAY>
</xsl:if>
</xsl:when>
<xsl:when test="name() = 'ids'">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">ID</xsl:attribute>
<xsl:element name="STRING">
<xsl:attribute name="ENCODING">HEX</xsl:attribute>
<xsl:value-of select="@original"/>
</xsl:element>
<xsl:element name="STRING">
<xsl:attribute name="ENCODING">HEX</xsl:attribute>
<xsl:value-of select="@modified"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'inklist'">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">InkList</xsl:attribute>
<!-- don't process gesture by recursion here as
this could blow the stack -->
<xsl:for-each select="*">
<xsl:element name="gesture">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:when>
<!-- special case for freetext (on a round trip,
this will appear as an attribute of the annotation,
to be consistent with other annotations -->
<xsl:when test="name() = 'border'">
<!-- this array is used by annotations
using a legacy layout of border
styles -->
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">Border</xsl:attribute>
<xsl:element name="INT">
<xsl:attribute name="VAL">0</xsl:attribute>
</xsl:element>
<xsl:element name="INT">
<xsl:attribute name="VAL">0</xsl:attribute>
</xsl:element>
<xsl:element name="INT">
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:element>
<xsl:element name="DICT">
<xsl:attribute name="KEY">BS</xsl:attribute>
<xsl:element name="INT">
<xsl:attribute name="KEY">W</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="@width"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'vertices'">
<!-- don't process vertices by recursion here as
this could blow the stack -->
<xsl:element name="vertices">
<xsl:value-of select="translate(current(), ';', ',')"/>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'contents-richtext'">
<xsl:element name="STRING">
<xsl:attribute name="KEY">RC</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'contents'">
<xsl:element name="STRING">
<xsl:attribute name="KEY">Contents</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="text()"/>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'defaultappearance'">
<xsl:element name="STRING">
<xsl:attribute name="KEY">DA</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
<xsl:when test="name() = 'defaultstyle'">
<xsl:element name="STRING">
<xsl:attribute name="KEY">DS</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:when>
<!-- data from sound, attachments -->
<xsl:when test="name() = 'data' or name() = 'resource'">
<xsl:call-template name="emitStream">
<xsl:with-param name="StreamData" select="."/>
<xsl:with-param name="FilterData" select="@filter"/>
<xsl:with-param name="AnnotationType" select="name(..)"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="ParentNotAnnots" select="name(..) != 'annots'"/>
<xsl:variable name="ElementName">
<xsl:choose>
<!-- most annotation names only need
the first character of the name
converted to upper case -->
<!-- put in exceptions to rule here -->
<xsl:when test="name() = 'strikeout'">
<xsl:text>StrikeOut</xsl:text>
</xsl:when>
<xsl:when test="name() = 'fileattachment'">
<xsl:text>FileAttachment</xsl:text>
</xsl:when>
<xsl:when test="name() = 'freetext'">
<xsl:text>FreeText</xsl:text>
</xsl:when>
<xsl:when test="name() = 'polyline'">
<xsl:text>PolyLine</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="StartAnnotChar">
<xsl:value-of select="translate (substring(name(), 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
</xsl:variable>
<xsl:value-of select="concat($StartAnnotChar, substring(name(), 2))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="DICT">
<xsl:if test="$ParentNotAnnots">
<xsl:attribute name="KEY">
<xsl:value-of select="$ElementName"/>
</xsl:attribute>
</xsl:if>
<!-- fill in the content of the
annotation define id later -->
<xsl:attribute name="DEFINE"/>
<xsl:element name="NAME">
<xsl:attribute name="KEY">Type</xsl:attribute>
<xsl:attribute name="VAL">Annot</xsl:attribute>
</xsl:element>
<xsl:element name="NAME">
<xsl:attribute name="KEY">Subtype</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="$ElementName"/>
</xsl:attribute>
</xsl:element>
<xsl:if test="$ParentNotAnnots">
<xsl:element name="DICT">
<xsl:attribute name="KEY">Parent</xsl:attribute>
<!-- fill in the content of the
parent reference later -->
<xsl:attribute name="REF"/>
</xsl:element>
</xsl:if>
<!-- handle width, style, intensity, dashes
start, end, head, tail attributes separately
from other attributes and nodes, as they
need to be wrapped within other nodes -->
<xsl:variable name="BorderEffect" select="@intensity|@style[. = 'cloudy']"/>
<xsl:variable name="BorderStyle" select="@width|@dashes|@style[not(. = 'cloudy')]"/>
<xsl:if test="string($BorderEffect) != ''">
<xsl:element name="DICT">
<xsl:attribute name="KEY">BE</xsl:attribute>
<xsl:apply-templates select="$BorderEffect"/>
</xsl:element>
</xsl:if>
<xsl:if test="string($BorderStyle) != ''">
<!-- this array is used by annotations
using a legacy layout of border
styles -->
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">Border</xsl:attribute>
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString">
<!-- use radii of zero -->
<xsl:text>0,0,</xsl:text>
<xsl:choose>
<xsl:when test="@width">
<xsl:value-of select="@width"/>
</xsl:when>
<!-- default width of one -->
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
<xsl:if test="@dashes">
<xsl:text>,</xsl:text>
<xsl:value-of select="@dashes"/>
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
<xsl:element name="DICT">
<xsl:attribute name="KEY">BS</xsl:attribute>
<xsl:apply-templates select="$BorderStyle"/>
</xsl:element>
</xsl:if>
<xsl:if test="@start|@end">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">L</xsl:attribute>
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString">
<xsl:value-of select="@start"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="@end"/>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:if>
<xsl:if test="@head|@tail">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">LE</xsl:attribute>
<!-- naming @head, @tail explicitly
ensures correct order -->
<xsl:element name="NAME">
<xsl:attribute name="VAL">
<xsl:value-of select="@head"/>
</xsl:attribute>
</xsl:element>
<xsl:element name="NAME">
<xsl:attribute name="VAL">
<xsl:value-of select="@tail"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:if>
<xsl:apply-templates select="*[not(name()='resource')]|@*[not(
name() = 'width' or
name() = 'style' or
name() = 'dashes' or
name() = 'intensity' or
name() = 'start' or
name() = 'end' or
name() = 'head' or
name() = 'tail' or
name() = 'file' or
name() = 'length' or
name() = 'encoding' or
name() = 'rate' or
name() = 'bits' or
name() = 'channels' or
name() = 'creation' or
name() = 'modification' or
name() = 'checksum' or
name() = 'size' or
name() = 'mimetype')]"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="@rotation">
<xsl:variable name="ElementName">
<xsl:choose>
<xsl:when test="floor(number(.)) = number(.)">INT</xsl:when>
<xsl:otherwise>FIXED</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:element name="{$ElementName}">
<xsl:attribute name="KEY">Rotate</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@rect">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">Rect</xsl:attribute>
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString" select="."/>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template match="@inlinetextrect">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">InlineTextRect</xsl:attribute>
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString" select="."/>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template match="@caretrect">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">CaretRect</xsl:attribute>
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString" select="."/>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template match="@fringe">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">RD</xsl:attribute>
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString" select="."/>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template match="@color">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">C</xsl:attribute>
<xsl:call-template name="convertHexColorToFloat">
<xsl:with-param name="HexString" select="substring(current(), 2)"/>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template match="@interior-color">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">IC</xsl:attribute>
<xsl:call-template name="convertHexColorToFloat">
<xsl:with-param name="HexString" select="substring(current(), 2)"/>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template match="@page">
<xsl:element name="INT">
<xsl:attribute name="KEY">Page</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@encoding">
<xsl:element name="NAME">
<xsl:attribute name="KEY">E</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:choose>
<xsl:when test="current() = 'raw'">Raw</xsl:when>
<xsl:when test="current() = 'signed'">Signed</xsl:when>
<xsl:when test="current() = 'mulaw'">muLaw</xsl:when>
<xsl:when test="current() = 'alaw'">ALaw</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@bits">
<xsl:element name="INT">
<xsl:attribute name="KEY">B</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@rate">
<xsl:element name="INT">
<xsl:attribute name="KEY">R</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@channels">
<xsl:element name="INT">
<xsl:attribute name="KEY">C</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@size">
<xsl:element name="INT">
<xsl:attribute name="KEY">Size</xsl:attribute>
<xsl:attribute name="VAL"><xsl:value-of select="."/></xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@length">
<xsl:element name="INT">
<xsl:attribute name="KEY">Length</xsl:attribute>
<xsl:attribute name="VAL"><xsl:value-of select="."/></xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@flags">
<xsl:element name="INT">
<xsl:attribute name="KEY">F</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:call-template name="convertFlags">
<xsl:with-param name="FlagString" select="."/>
</xsl:call-template>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@modification">
<xsl:element name="STRING">
<xsl:attribute name="KEY">ModDate</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@date">
<xsl:element name="STRING">
<xsl:attribute name="KEY">M</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@creationdate|@creation">
<xsl:element name="STRING">
<xsl:attribute name="KEY">CreationDate</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@title">
<xsl:element name="STRING">
<xsl:attribute name="KEY">T</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@name">
<xsl:element name="STRING">
<xsl:attribute name="KEY">NM</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@inreplyto">
<xsl:element name="STRING">
<xsl:attribute name="KEY">IRT</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@width">
<xsl:element name="INT">
<xsl:attribute name="KEY">W</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@style">
<xsl:element name="NAME">
<xsl:attribute name="KEY">S</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:choose>
<xsl:when test="current() = 'solid'">S</xsl:when>
<xsl:when test="current() = 'dash'">D</xsl:when>
<xsl:when test="current() = 'bevelled'">B</xsl:when>
<xsl:when test="current() = 'inset'">I</xsl:when>
<xsl:when test="current() = 'underline'">U</xsl:when>
<xsl:when test="current() = 'cloudy'">C</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@dashes">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">D</xsl:attribute>
<xsl:call-template name="emitNumbers">
<xsl:with-param name="NumberString">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template match="@intensity">
<xsl:element name="INT">
<xsl:attribute name="KEY">I</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@subject">
<xsl:element name="STRING">
<xsl:attribute name="KEY">Subj</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@icon">
<xsl:element name="NAME">
<xsl:attribute name="KEY">Name</xsl:attribute>
<xsl:attribute name="VAL"><xsl:value-of select="."/></xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@open">
<xsl:element name="BOOL">
<xsl:attribute name="KEY">Open</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:choose>
<xsl:when test="current()='yes'">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@opacity">
<xsl:element name="FIXED">
<xsl:attribute name="KEY">CA</xsl:attribute>
<xsl:attribute name="VAL"><xsl:value-of select="."/></xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@justification">
<xsl:element name="INT">
<xsl:attribute name="KEY">Q</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:choose>
<xsl:when test="current() = 'left'">0</xsl:when>
<xsl:when test="current() = 'centered'">1</xsl:when>
<xsl:when test="current() = 'right'">2</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@coords">
<!-- don't process coords by recursion here as
this could blow the stack -->
<xsl:element name="quadpoints">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@state">
<xsl:element name="STRING">
<xsl:attribute name="KEY">State</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@statemodel">
<xsl:element name="STRING">
<xsl:attribute name="KEY">StateModel</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@checksum">
<xsl:element name="STRING">
<xsl:attribute name="KEY">CheckSum</xsl:attribute>
<xsl:attribute name="ENCODING">HEX</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@mimetype">
<xsl:element name="NAME">
<xsl:attribute name="KEY">Subtype</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@file">
<xsl:element name="STRING">
<xsl:attribute name="KEY">F</xsl:attribute>
<xsl:attribute name="ENCODING">ASCII</xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="@symbol">
<xsl:element name="NAME">
<xsl:attribute name="KEY">Sy</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:choose>
<xsl:when test=". = 'none'"></xsl:when>
<xsl:when test=". = 'paragraph'">P</xsl:when>
<xsl:when test=". = 'space'">S</xsl:when>
</xsl:choose>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@filter">
<xsl:choose>
<!-- more than one filter -->
<xsl:when test="contains(., ',')">
<xsl:element name="ARRAY">
<xsl:attribute name="KEY">Filter</xsl:attribute>
<xsl:call-template name="emitFilters">
<xsl:with-param name="FilterList">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</xsl:element>
</xsl:when>
<!-- just one filter -->
<xsl:otherwise>
<xsl:element name="NAME">
<xsl:attribute name="KEY">Filter</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Mac specific attributes of a file attachment -->
<xsl:template match="@subtype">
<xsl:element name="INT">
<xsl:attribute name="KEY">Subtype</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<xsl:template match="@creator">
<xsl:element name="INT">
<xsl:attribute name="KEY">Creator</xsl:attribute>
<xsl:attribute name="VAL">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:element>
</xsl:template>
<!-- end of annotation handling -->
<!-- get rid of any extraneous text nodes and attributes -->
<xsl:template match="text()|@*"/>
</xsl:stylesheet>